const path = require('path')
const Koa = require('koa')
const convert = require('koa-convert')// 转换旧中间件的写法
const views = require('koa-views')// 模板引擎
const staticServer = require('koa-static')// 静态资源服务
const router = require('koa-router')
const cors = require('koa-cors')// 跨域
const send = require('koa-send')// 发送文件
const logger = require('koa-logger')// 控制台日志
const koaBody = require('koa-body')//用了ka-body就不需要koa-bodyparser
//import bodyParser from 'koa-bodyparser';// 报文转换

// 引用配置和api
const serverConfig = require('./config/config.js')

const app = new Koa()


// 自定义记录执行时间中间件
app.use(async (ctx, next) => {
  const start = new Date();
  await next();
  const ms = new Date() - start;
  console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
});

app.use(convert(logger()));

// 跨域请求中间件
app.use(convert(
    cors({
        origin: '*'
    })
));

// 模板引擎中间件
app.use(views(`${__dirname}/views`, {
    extension: 'html',
    map: {
        html: 'handlebars'
} }))

// 静态资源服务
app.use(convert(staticServer(path.join(__dirname, 'static'))));

// 报文转换
//app.use(bodyParser());
app.use(convert(koaBody({
    multipart: true,
    formidable: {
        uploadDir: __dirname + '/upload',
        keepExtensions:true,
        hash:false
    }
    }))
);


// 发送文件，如HTML
app.use(async (ctx, next) => {
    ctx.send = send
    await next()
})

// 路由注册中间件
const dataApi = require('./routes/dataApi.js')
const pageApi = require('./routes/pageApi.js')

app.use(dataApi.routes()).use(dataApi.allowedMethods());
app.use(pageApi.routes()).use(pageApi.allowedMethods());

// 404处理
app.use(async (ctx, next) => {
    ctx.status=404;
    await ctx.render('404.html')
});

// 错误处理
app.on('error', (err, ctx)=>{
    console.error('server error', err, ctx);
});


// 启动服务
app.listen(serverConfig.port,(err)=>{
    if(err){
        console.error(err);
    }else{
        console.log(`请访问localhost:3000...`);
    }
});